package model

import (
	"github.com/lib/pq"
	managerDto "gitlab.local/backend/proto/manager"
	"manager/model/entity"
	"manager/model/po"
)

type IsBind int

var (
	BindNo  IsBind = 0 //未绑定
	BindYes IsBind = 1
)

type IsManager int

const (
	IsManagerNo IsManager = iota
	IsManagerYes
)

type EbikeStatus int

const (
	EbikeStatusNormal  EbikeStatus = iota // 正常
	EbikeStatusLocked                     // 锁定
	EbikeStatusFaulted                    // 故障
)

type StockStatus int

const (
	StockFactoryIn StockStatus = iota
	StockFactoryOut
	StockIn
	StockOut
)

type FileTypeSuffix string

const (
	FileXls  FileTypeSuffix = "xls"
	FileXlsx FileTypeSuffix = "xlsx"
)

var FileMap = map[string]FileTypeSuffix{
	"xls":  FileXls,
	"xlsx": FileXlsx,
}

// EbikeDistributeRequest 车辆分发请求参数
type EbikeDistributeRequest struct {
	EbikeId int64 `json:"device_id" binding:"required"` // 车辆
	StoreId int64 `json:"store_id" binding:"required"`  // 店铺ID
}

type BatchCreateReq struct {
	TypeID      int64  `json:"type_id" binding:"required"`
	Color       string `json:"color" binding:"required"`
	BatteryType int64  `json:"battery_type" binding:"required"`
	Photo       string `json:"photo" binding:"required"`
}

type BatchCreateResp struct {
	FailedSnCode []string `json:"failed_sn_code"`
}

type EbikeCreateRequest struct {
	TypeID int64 `json:"type_id" binding:"required"`

	Name string `json:"name"`

	Photo string `json:"photo"`

	Status int `json:"status"`

	FrameCode string `json:"frame_code" binding:"required"`

	EngineCode string `json:"engine_code" binding:"required"`

	SNCode string `json:"sn_code" binding:"required,len=16"`

	Color string `json:"color" binding:"required"`

	Stock int `json:"stock"`

	BindUsers []string `json:"bind_users"`

	BatteryType int64 `json:"battery_type"`
}

type EbikeUpdateRequest struct {
	ID int64 `json:"id" binding:"required"`

	TypeID *int64 `json:"type_id"`

	BatteryType *int64 `json:"battery_type"`

	Name *string `json:"name"`

	Status *int `json:"status"`

	FrameCode *string `json:"frame_code"`

	EngineCode *string `json:"engine_code"`

	Color *string `json:"color"`

	IsBind *int `json:"is_bind"`

	Stock *int `json:"stock"`

	FirmwareID *int64 `json:"firmware_id"`

	AESKey string `json:"aes_key" `

	IV string `json:"iv"`

	StoreID *int64 `json:"store_id"`

	CreatedAt int64 `json:"created_at"`

	UpdatedAt int64 `json:"updated_at"`

	BindUsers *pq.StringArray `json:"bind_users"`

	SNCode string `json:"sn_code" `

	DistributeTime *int64 `json:"distribute_time"`
}

type EbikeListRequest struct {
	Index     int  `json:"index"`
	Size      int  `json:"size"`
	OnlyCount bool `json:"only_count"`
	OnlyList  bool `json:"only_list"`

	TypeID *int64 `json:"type_id" ` //车型ID

	Status *int `json:"status"` //车辆状态

	FrameCode string `json:"frame_code"` // 车架号

	IsBind *int `json:"is_bind"` //绑定状态

	Stock *int `json:"stock"` //库存状态

	StoreID int64 `json:"store_id"` // 门店ID

	BindStart int64 `json:"bind_start"` //绑定开始时间

	BindEnd int64 `json:"bind_end"` // 绑定结束时间

	SNCode string `json:"sn_code"` //SN查询

	SNCodes []string `json:"sn_codes"` //SN查询

	BikeIds []int64 `json:"type_ids"` // 车辆ID列表

	TypeIds []int64 `json:"bike_ids"` // 车辆类型Ids

	TypeName *string `json:"bike_type_name"` // 车辆类型名称

	TypeNames []string `json:"bike_type_names"` // 车辆类型名称

	Statuses []managerDto.EbikeStatus `json:"statuses"` // 车辆状态列表

	EbikeId *int64 `json:"ebike_id"` // 车辆ID

	SearchTimeZone []int64 `json:"search_time_zone"` //查询时间区间

	UserId *int64 `json:"user_id"` // 用户ID

	UserIds []int64 `json:"user_ids"` // 用户ID列表
}

type EbikeListResponse struct {
	Total int          `json:"total"`
	Data  []*EbikeInfo `json:"list"`
}

type EbikesListResponse struct {
	Total       int                   `json:"total"`
	BindCount   int                   `json:"bind_count"`   //绑定数量
	DeviceCount int                   `json:"device_count"` //设备总数
	Data        []*EbikesInfoResponse `json:"list"`
}

// EbikesInfoResponse 车辆列表返回单个对象
type EbikesInfoResponse struct {
	ID             int64  `json:"id"`               // 设备ID
	UserID         int64  `json:"user_id"`          //用户ID
	UserName       string `json:"user_name"`        //用户名称
	DeviceTypeName string `json:"device_type_name"` //车型名称
	// 门店名称

	TypeID int64 `json:"type_id"` //车型id

	Status int `json:"status"` //车辆状态

	EngineCode string `json:"engine_code"`
	Color      string `json:"color"`

	BatteryId int64 `json:"battery_id"`

	FrameCode string `json:"frame_code"` // 车架号

	StockStatus int `json:"stock_status"` // 库存状态 : 0 厂家入库 1厂家出库 2 门店入库3门店已售出

	SocketType int `json:"socket_type"` // 类型：0 蓝牙版，1 4G版

	Is4gOnline bool `json:"is_4g_online"` // 4G是否在线

	IsBind int `json:"is_bind"` //绑定状态

	StoreID int64 `json:"store_id"` //门店ID

	BindTime int64 `json:"bind_time"` //绑定时间

	Name string `json:"name"` //车辆名称

	CreatedAt int64 `json:"created_at"` // 创建时间

	BindUsers pq.StringArray `gorm:"column:bind_users;type:VARCHAR" json:"bind_users"`

	DistributeTime int64 `json:"distribute_time"`

	FirmwareId int64 `json:"firmware_id"`

	SNCode string `gorm:"column:sn_code;type:VARCHAR(255)" json:"sn_code"`

	FirmwareVersion string `json:"firmware_version"`
}

type EbikeInfo struct {
	ID int64 `json:"id"`

	TypeID int64 `json:"type_id"`

	Name string `json:"name"`

	Status int `json:"status"`

	FrameCode string `json:"frame_code"`

	EngineCode string `json:"engine_code"`

	Color string `json:"color"`

	IsBind int `json:"is_bind"`

	Stock int `json:"stock"`

	FirmwareID int64 `json:"firmware_id"`

	AESKey string `json:"aes_key"`

	IV string `json:"iv"`

	StoreID int64 `json:"store_id"`

	CreatedAt int64 `json:"created_at"`

	UpdatedAt int64 `json:"updated_at"`

	BindUsers pq.StringArray `json:"bind_users"`

	SNCode    string `json:"sn_code"`
	ControlId int64  `json:"control_id"`
	BatteryId int64  `json:"battery_id"`
}

type EbikeInfoResponse struct {
	ID int64 `json:"id"`

	TypeID int64 `json:"type_id"`

	TypeName string `json:"type_name"`

	Name string `json:"name"`

	Status int `json:"status"`

	FrameCode string `json:"frame_code"`

	EngineCode string `json:"engine_code"`

	Color string `json:"color"`

	IsBind int `json:"is_bind"`

	Stock int `json:"stock"`

	FirmwareID int64 `json:"firmware_id"`

	StoreID int64 `json:"store_id"`

	CreatedAt int64 `json:"created_at"`

	UpdatedAt int64 `json:"updated_at"`

	BindUsers []string `json:"bind_users"`

	SNCode string `json:"sn_code"`

	Mac string `json:"mac"`

	Imei string `json:"imei"`

	Iccid string `json:"iccid"`

	Imsi string `json:"imsi"`
}

type EbikeDeleteRequest struct {
	ID int64 `json:"id"`
}

type EbikeBaseRequest struct {
	ID     *int64  `json:"id" `
	SnCode *string `json:"sn_code"`
}

type UserListEbikeRequest struct {
	ID        int64   `json:"user_id" binding:"required"`
	FrameCode *string `json:"frame_code"`
	IsManager *int    `json:"is_manager"`
}

type EbikeCountResponse struct {
	Total     int64 `json:"total_count"` // 车辆总数
	BindCount int64 `json:"bind_count"`  // 已绑定总数
}

func EbikesEntityToDto(ebikes []*entity.Ebike) []*EbikeInfo {
	out := make([]*EbikeInfo, 0, len(ebikes))
	for _, c := range ebikes {
		out = append(out, EbikeEntityToDto(c))
	}
	return out
}

func EbikeEntityToDto(e *entity.Ebike) *EbikeInfo {
	return &EbikeInfo{

		ID: e.ID,

		TypeID: e.TypeID,

		Name: e.Name,

		Status: e.Status,

		FrameCode: e.FrameCode,

		EngineCode: e.EngineCode,

		Color: e.Color,

		IsBind: e.IsBind,

		Stock: e.Stock,

		FirmwareID: 0,

		AESKey: e.AESKey,

		IV: e.IV,

		StoreID: e.StoreID,

		CreatedAt: e.CreatedAt,

		UpdatedAt: e.UpdatedAt,

		BindUsers: e.BindUsers,

		SNCode: e.SNCode,

		ControlId: e.ControlId,
		BatteryId: e.BatteryId,
	}
}

//----------------app-------------------

type EbikeAppBindRequest struct {
	SnCode string `json:"sn_code" binding:"required"`
}

type Prop struct {
	PropId  int `json:"prop_id"`
	PropVal int `json:"prop_val"`
}

// EbikeAppListResponse app端用户车辆列表返回
type EbikeAppListResponse struct {
	ID              int64          `json:"id"`
	Name            string         `json:"name"`
	Photo           string         `json:"photo"`
	ShareTime       int64          `json:"share_time"`
	SocketType      int            `json:"socket_type"` // 蓝牙还是4G
	FrameCode       string         `json:"frame_code"`  // 车架号
	EngineCode      string         `json:"engine_code"` // 电机号
	SNCode          string         `json:"sn_code"`     // SN号
	Status          int            `json:"status"`
	Color           string         `json:"color"` // 颜色
	Mac             string         `json:"mac"`
	ImagePath       pq.StringArray `gorm:"column:image_path" json:"-"`
	Image           string         `json:"image"`
	IsManager       int            `json:"is_manager"`
	DeviceTypeName  string         `json:"device_type_name"` //车型名称
	DeviceTypeId    int64          `json:"device_type_id"`   //车型ID
	BatteryId       int64          `json:"battery_id"`       //电池ID
	BatteryType     int            `json:"battery_type"`     //电池类型
	BatteryCapacity string         `json:"battery_capacity"` //电池容量
	CreatedAt       int64          `json:"created_at"`
	IsShowCouch     bool           `json:"is_show_couch"`
	AdditionalProps []*Prop        `json:"additional_props"`
}

type ExecStatus int // 车辆开机关机

var (
	ExecON  ExecStatus = 1 // 开机
	ExecOFF ExecStatus = 0 // 关机
)

type EbikeAppExecRequest struct {
	EbikeID int64 `json:"device_id" binding:"required"`
	OnOff   *int  `json:"on_off" binding:"required"`
}

type EbikeAppLockRequest struct {
	EbikeID int64 `json:"device_id" binding:"required"`
	Status  *int  `json:"status" binding:"required"`
}

type AppEbikeFindBySnRequest struct {
	SnCode string `json:"sn_code" binding:"required"`
}

type AppEbikeFindBySnResponse struct {
	Photo     string `json:"photo"`      //图片
	FrameCode string `json:"frame_code"` //车架号
	Name      string `json:"name"`       //车辆名称
	IsBind    int    `json:"is_bind"`    //是否绑定
}

type AppEbikeInfoResponse struct {
	ID int64 `json:"id"`

	TypeID int64 `json:"type_id"`

	TypeName string `json:"type_name"`

	Name  string `json:"name"`
	Image string `json:"image"`

	Status int `json:"status"`

	FrameCode string `json:"frame_code"`

	EngineCode string `json:"engine_code"`

	Color string `json:"color"`

	IsBind int `json:"is_bind"`

	Stock int `json:"stock"`

	FirmwareID int64 `json:"firmware_id"`

	StoreID int64 `json:"store_id"`

	CreatedAt int64 `json:"created_at"`

	UpdatedAt int64 `json:"updated_at"`

	BindUsers []string `json:"bind_users"`

	SNCode string `json:"sn_code"`

	IsManager  int `json:"is_manager"`
	SocketType int `json:"socket_type"` // 蓝牙还是4G

	// 中控

	Mac string `json:"mac"`

	Imei string `json:"imei"`

	Iccid string `json:"iccid"`

	Imsi string `json:"imsi"`

	FirmwareVersion string `json:"firmware_version"`

	// 购车网点
	StoreName string `json:"store_name"`
	// 购车时间
	BuyTime int64 `json:"buy_time"`
	// 激活时间
	ActivationTime int64 `json:"activation_time"`
	// 三包有效期
	WarrantyPeriodTime int64 `json:"warranty_period_time"`
}

type BikeInfoRequest struct {
	EbikeId int64 `json:"ebike_id"  binding:"required"`
}

type CheckBluetoothReq struct {
	Sn string `json:"sn" binding:"required"`
}

// BikeInfo 车辆信息
type BikeInfo struct {
	ID int64 `gorm:"column:id;type:BIGINT;primary_key" json:"id"`

	TypeID int64 `gorm:"column:type_id;type:BIGINT" json:"type_id"`

	Name string `gorm:"column:name;type:VARCHAR(255)" json:"name"`

	Photo string `gorm:"column:photo;type:VARCHAR(255)" json:"photo"`

	Color string `gorm:"column:color;type:VARCHAR(255)" json:"color"`

	Status int `gorm:"column:status;type:TINYINT" json:"status"`

	FrameCode string `gorm:"column:frame_code;type:VARCHAR(255)" json:"frame_code"`

	EngineCode string `gorm:"column:engine_code;type:VARCHAR(255)" json:"engine_code"`

	IsBind int `gorm:"column:is_bind;type:TINYINT" json:"is_bind"`

	Stock int `gorm:"column:stock;type:TINYINT" json:"stock"`

	StoreID   int64 `gorm:"column:store_id;type:BIGINT" json:"store_id"`
	ControlId int64 `gorm:"column:control_id;type:BIGINT" json:"control_id"`
	BatteryId int64 `gorm:"column:battery_id;type:BIGINT" json:"battery_id"`

	BindUsers pq.StringArray `gorm:"column:bind_users;type:VARCHAR" json:"bind_users"`

	CreatedAt int64 `gorm:"column:created_at;type:BIGINT" json:"created_at"`

	UpdatedAt int64 `gorm:"column:updated_at;type:BIGINT" json:"updated_at"`

	SNCode string `gorm:"column:sn_code;type:VARCHAR(255)" json:"sn_code"`

	// 车型信息
	SocketType int    `json:"socket_type"` // 蓝牙还是4G
	TypeName   string `json:"type_name"`   // 车型名称

	// 中控信息
	Mac string `json:"mac"`

	Imei string `json:"imei"`

	Iccid string `json:"iccid"`

	Imsi string `json:"imsi"`

	FirmwareVersion string `json:"firmware_version"`

	// 电池信息
	BatteryCode string `gorm:"column:battery_code;type:VARCHAR(255)" json:"battery_code"`

	FirmwaresVersion string `gorm:"column:firmwares_version;type:VARCHAR(255)" json:"firmwares_version"`

	BatteryName string `gorm:"column:name;type:VARCHAR(255)" json:"name"`

	Version string `gorm:"column:version;type:VARCHAR(255)" json:"version"`

	Voltage string `gorm:"column:voltage;type:VARCHAR(255)" json:"voltage"`

	Type int `gorm:"column:type;type:TINYINT" json:"type"`

	Supplier string `gorm:"column:supplier;type:VARCHAR(255)" json:"supplier"`

	Capacity string `gorm:"column:capacity;type:VARCHAR(255)" json:"capacity"`

	// 购车网点
	StoreName string `json:"store_name"`
	// 购车时间
	BuyTime int64 `json:"buy_time"`
	// 激活时间
	ActivationTime int64 `json:"activation_time"`
	// 三包有效期
	WarrantyPeriodTime int64 `json:"warranty_period_time"`

	// 车辆位置
	Location po.Location `json:"location"`
}

// UserBikeInfo 用户车辆信息
type UserBikeInfo struct {
	DeviceStatusRsp
	BikeInfo
	IsManager               int    `json:"is_manager"`
	BikeName                string `json:"bike_name"`
	BikeImage               string `json:"bike_image"`
	Name                    string `json:"name"`
	BatteryType             int    `json:"battery_type"`
	BatteryFirmwaresVersion string `json:"battery_firmwares_version"`
}

type EbikeChangeRequired struct {
	EbikeId int64 `json:"ebike_id" binding:"required"`
	UserId  int64 `json:"user_id"  binding:"required"`
	IsClear *int  `json:"is_clear" ` // 是否删除用户车辆数据 0 否 1是
}

// DeviceStatusReq  设备状态
type DeviceStatusReq struct {
	EbikeId int64 `json:"ebike_id"`
}

type DeviceStatusRsp struct {
	EbikeId      int64 `json:"ebike_id"`
	PowerStatus  int   `json:"power_status"`  // 0关闭 1启动中 2 启动成功
	LockStatus   int   `json:"lock_status"`   // 1 锁定状态 0 解锁状态
	OnlineStatus int   `json:"online_status"` // 0 离线 1 在线
}

// AuthTransferReq 授权转移
type AuthTransferReq struct {
	TargetPhones []string `json:"target_phones"` // 目标手机号
	EbikeId      int64    `json:"ebike_id"`      // 车辆ID
}

type AuthTransferRsp struct {
}

// OperationInfoReq 运行信息
type OperationInfoReq struct {
	EbikeId int64 `json:"ebike_id"`
}

type OperationInfoRsp struct {
	EbikeId         int64  `json:"ebike_id"`
	BatteryCapacity string `json:"battery_capacity"` // 电池容量
	BatteryLevel    int    `json:"battery_level"`    // 电池电量
	BatteryHealth   int    `json:"battery_health"`   // 电池健康度
	ChargingTime    int    `json:"charging_time"`    // 充电时长 分钟
	Temperature     int    `json:"temperature"`      // 温度
	BatteryVoltage  int    `json:"battery_voltage"`  // 电池电压
	ChargeDischarge int    `json:"charge_discharge"` // 充放电次数
	Endurance       int    `json:"endurance"`        // 续航里程 公里

	GPS       bool `json:"gps"`       // 是否有GPS
	Bluetooth bool `json:"bluetooth"` // 是否有蓝牙
	Net       bool `json:"net"`       // 是否有网络

	AlarmTimes     int `json:"alarm_times"`     // 报警次数
	FaultTimes     int `json:"fault_times"`     // 故障次数
	VibrationTimes int `json:"vibration_times"` // 震动次数

	ConsumerPowerOfDay int `json:"consumer_power_of_day"` // 当日消耗电量

	FirmwareVersion string `json:"firmware_version"`
}

type ShadowAttribute struct {
	Status          string `protobuf:"varint,1,opt,name=status,proto3,enum=dto.BatteryStatus" json:"status,omitempty"`
	Soc             string `protobuf:"varint,3,opt,name=soc,proto3" json:"soc,omitempty"` // 单位为0.1%
	Soe             string `protobuf:"varint,4,opt,name=soe,proto3" json:"soe,omitempty"`
	Soh             string `protobuf:"varint,5,opt,name=soh,proto3" json:"soh,omitempty"`
	Temperature     string `protobuf:"varint,6,opt,name=temperature,proto3" json:"temperature,omitempty"`
	Voltage         string `protobuf:"varint,7,opt,name=voltage,proto3" json:"voltage,omitempty"`
	RemainTime      string `protobuf:"varint,8,opt,name=remain_time,json=remainTime,proto3" json:"remain_time,omitempty"`
	Loop            string `protobuf:"varint,9,opt,name=loop,proto3" json:"loop,omitempty"`
	Signal4g        string `json:"signal_4g"`
	SignalGps       string `json:"signal_gps"`
	FirmwareVersion string `json:"firmware_version"`
}

type DeviceStatus struct {
	Lock   string `json:"lock"`
	Online string `json:"online"`
	Power  string `json:"power"`
}

type DeviceCallBack struct {
	// 易车那边的sncode,暂时没有用到
	SNCode    string `json:"sn_code"`
	FrameCode string `json:"frame_code"`
	// 车联网这边实际sncode就是16位中控号码
	ControlCode string `json:"control_code"`
	EngineCode  string `json:"engine_code"`
	BatteryType string `json:"battery_type"`
	Name        string `json:"name"`
	Model       string `json:"model"`
	Color       string `json:"color"`
	// 业务暂时没有用到
	DeliveryTime string `json:"delivery_time"`
	// 保留字段，目前erp以提供，但是ebike暂时没有用到
	Factory string `json:"factory"`
}

type DeviceCallBackErr struct {
	Sn string `json:"sn"`
	// 异常信息
	Msg string `json:"msg"`
}

type DeviceCallBackRequest struct {
	EBikes []DeviceCallBack `json:"ebikes"`
}

type DeviceCallBackResponse struct {
	EBikes []DeviceCallBackErr `json:"ebikes"`
}

// 车辆类型更新检查
type CheckDeviceConfigRequest struct {
	DeviceTypeId int64 `json:"device_type_id" binding:"required"`
	UpdatedAt    int64 `json:"updated_at" binding:"required"`
}

type CheckDeviceConfigResponse struct {
	IsUpdated int `json:"is_updated"`
}
